package com.stx.jeepay.merchant.controller;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.stx.jeepay.core.entity.SysRoleEntRelaEntity;
import com.stx.jeepay.core.entity.SysRoleEntity;
import com.stx.jeepay.core.entity.SysUserRoleRelaEntity;
import com.stx.jeepay.core.enums.ApiCodeEnum;
import com.stx.jeepay.core.expection.BizException;
import com.stx.jeepay.core.model.ApiPageRes;
import com.stx.jeepay.core.model.ApiRes;
import com.stx.jeepay.core.service.SysRoleEntRelaService;
import com.stx.jeepay.core.service.SysRoleService;
import com.stx.jeepay.core.service.SysUserRoleRelaService;
import com.stx.jeepay.merchant.service.AuthService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@Api(tags = "系统管理（用户-角色-权限关联信息）")
@RestController
@RequestMapping("api/sysRoleEntRelas")
public class SysRoleEntRelaController extends CommonCtrl {
    @Autowired
    private SysRoleEntRelaService sysRoleEntRelaService;
    @Autowired
    private SysUserRoleRelaService sysUserRoleRelaService;
    @Autowired
    private SysRoleService sysRoleService;
    @Autowired
    private AuthService authService;

    @ApiOperation("关联关系--角色-权限关联信息列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "iToken", value = "用户身份凭证", required = true, paramType = "header"),
            @ApiImplicitParam(name = "pageNumber", value = "分页页码", dataType = "int", defaultValue = "1"),
            @ApiImplicitParam(name = "pageSize", value = "分页条数（-1时查全部数据）", dataType = "int", defaultValue = "20"),
            @ApiImplicitParam(name = "roleId", value = "角色ID, ROLE_开头")
    })
    @PreAuthorize("hasAuthority( 'ENT_UR_ROLE_DIST' )")
    @RequestMapping(value = "", method = RequestMethod.GET)
    public ApiPageRes<SysRoleEntRelaEntity> list() {
        SysRoleEntRelaEntity queryObject = getObject(SysRoleEntRelaEntity.class);

        LambdaQueryWrapper<SysRoleEntRelaEntity> queryWrapper = new LambdaQueryWrapper<>();

        if (queryObject.getRoleId() != null) {
            queryWrapper.eq(SysRoleEntRelaEntity::getRoleId, queryObject.getRoleId());
        }

        IPage<SysRoleEntRelaEntity> pages = sysRoleEntRelaService.page(getIPage(true), queryWrapper);

        return ApiPageRes.pages(pages);
    }

    @PreAuthorize("hasAuthority( 'ENT_UR_ROLE_DIST' )")
    @RequestMapping(value = "relas/{roleId}", method = RequestMethod.POST)
    public ApiRes relas(@PathVariable("roleId") String roleId) {
        SysRoleEntity sysRole = sysRoleService.getOne(new LambdaQueryWrapper<SysRoleEntity>()
                .eq(SysRoleEntity::getRoleId, roleId)
                .eq(SysRoleEntity::getBelongInfoId, getCurrentMchNo()));
        if (sysRole == null) {
            throw new BizException(ApiCodeEnum.SYS_OPERATION_FAIL_SELETE);
        }

        List<String> entIdList = JSONArray.parseArray(getValStringRequired("entIdListStr"), String.class);

        sysRoleEntRelaService.resetRela(roleId, entIdList);

        List<Long> sysUserIdList = new ArrayList<>();
        sysUserRoleRelaService.list(new LambdaQueryWrapper<SysUserRoleRelaEntity>()
                        .eq(SysUserRoleRelaEntity::getRoleId, roleId))
                .stream().forEach(item -> {
                    sysUserIdList.add(item.getUserId());
                });

        //查询到该角色的人员， 将redis更新
        authService.refAuthentication(sysUserIdList);

        return ApiRes.ok();
    }
}
